package com.tdam2011.grupo06.control;

import java.util.Date;
import com.tdam2011.grupo06.gui.HistorialContacto.ItemHistorialAdapter;
import com.tdam2011.grupo06.model.Contacto;
import com.tdam2011.grupo06.model.Email;
import com.tdam2011.grupo06.model.ItemEmail;
import com.tdam2011.grupo06.model.ItemHistorial;
import com.tdam2011.grupo06.model.Llamada;
import com.tdam2011.grupo06.model.Mensaje;
import com.tdam2011.grupo06.model.MensajeBob;
import com.tdam2011.grupo06.model.Telefono;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.CallLog;
import android.provider.ContactsContract;

public class GestorHistorialContacto 
{
	private ItemHistorialAdapter adapter;
	private Context context;
	
	public GestorHistorialContacto(ItemHistorialAdapter a, Context c)
	{
		adapter = a;
		context = c;
	}
	
	public Contacto cargarHistorial(int idContacto)
	{
		ContentResolver cr = context.getContentResolver();
		Contacto aux = new Contacto();
        Cursor cur = cr.query(ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, (long)idContacto), null, null, null, null);
        if (cur.moveToNext()) 
        {
        	String nombre = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
	        aux.setNombre(nombre);
	        
	        aux.setPhotoUri( StrUriPhoto.getInstance().getPhotoUriById(context, idContacto) );
	        aux.setDbId(idContacto);
	        
	        if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
	        {
	        	Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{String.valueOf(idContacto)}, null);

	        	while (pCur.moveToNext()) 
     	        {
	        		String idTel = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID));
	        		String tel = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
	        		String type = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
	        		aux.addTel(new Telefono(Integer.parseInt(idTel), tel, Integer.parseInt(type)));   		
     	        } 
     	        pCur.close();
 	        }
	        
	        Cursor eCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID +" = ?",new String[]{String.valueOf(idContacto)}, null);

        	while (eCur.moveToNext()) 
 	        {
        		String idMail = eCur.getString(eCur.getColumnIndex(ContactsContract.CommonDataKinds.Email._ID));
        		String m = eCur.getString(eCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
        		String type = eCur.getString(eCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
        		aux.addEmail(new Email(Integer.parseInt(idMail), m, Integer.parseInt(type)));
 	        } 
 	        eCur.close();
	        
 	        //Cargando historial
 	       Cursor telCur = cr.query(CallLog.Calls.CONTENT_URI, null, null, null, null);
 	        while (telCur.moveToNext()) 
 		    {
 		    	String id = telCur.getString(telCur.getColumnIndex(CallLog.Calls._ID));
 		        String numero = telCur.getString(telCur.getColumnIndex(CallLog.Calls.NUMBER));
 		        String tipo = telCur.getString(telCur.getColumnIndex(CallLog.Calls.TYPE));
 		        Date fecha = new Date(telCur.getLong(telCur.getColumnIndex(CallLog.Calls.DATE)));
 		        
 		        numero = parse(cr,numero);
 		        if(aux.existsTel(numero))
 		        {
 		        	adapter.addItemInfo(new Llamada(Integer.parseInt(id),idContacto,Integer.parseInt(tipo),fecha,numero,aux.getNombre()));
 		        }
 	 		}
 	        telCur.close();
 	        
 	        Cursor smsCur = cr.query(Uri.parse("content://sms"), null, null, null, null);
 	        while (smsCur.moveToNext()) 
 		    {
 	        	String id = smsCur.getString(smsCur.getColumnIndex("_id"));
 		    	String numero = smsCur.getString(smsCur.getColumnIndex("address"));
 		    	Date fecha = new Date(smsCur.getLong(smsCur.getColumnIndex("date")));
 		    	String tipo = smsCur.getString(smsCur.getColumnIndex("type"));
 		    	
 		    	if (numero!=null)
 		    	{
 		    		numero = parse(cr,numero);
 		    		if(aux.existsTel(numero))
	 		        {
	 		    		adapter.addItemInfo(new Mensaje(Integer.parseInt(id),idContacto,Integer.parseInt(tipo),fecha,numero,aux.getNombre(),1));
	 		        }
 		    	}
 	 		}
 	        smsCur.close();
 	        
 	        Cursor mmsCur = cr.query(Uri.parse("content://mms"), null, null, null, null);
 	        while (mmsCur.moveToNext()) 
 		    {
 	        	String id = mmsCur.getString(mmsCur.getColumnIndex("_id"));
 	        	long timestamp = mmsCur.getLong(mmsCur.getColumnIndex("date"))* 1000;//Necesario para los mms
 	    	    Date fecha = new Date(timestamp);
 		    	String numero="";
 		    	String tipo="0";
 				
 	    		Uri uriAddr = Uri.parse ("content://mms/" + id + "/addr");
 	    		Cursor mmsCur2 = cr.query(uriAddr,null,"type=137",null,null);
 	    	    if(mmsCur2.moveToNext())
 	    	    {
 	    	    	numero = mmsCur2.getString (mmsCur2.getColumnIndex ("address"));
 	    	    	if(numero.contentEquals("insert-address-token"))
 	    	    	{
 	    	    		mmsCur2.close();
 	    	    		mmsCur2 = cr.query(uriAddr,null,"type=151", null,null);
 	    	    		if(mmsCur2.moveToNext())
 	    	    		{
 	    	    			numero = mmsCur2.getString(mmsCur2.getColumnIndex("address"));
 	    	    			tipo = "2";
 	    	    		}
 	    	    	}
 	    	    	else
 	    	    	{
 	    	    		tipo = "1";
 	    	    	}
 	    	    }
 	    	    mmsCur2.close();
 		    	    
 	    	   if (numero!=null)
 	    	   {
 	    		   numero = parse(cr,numero);
 	    		   if(aux.existsTel(numero))
 	    		   {
 	    			   adapter.addItemInfo(new Mensaje(Integer.parseInt(id),idContacto,Integer.parseInt(tipo),fecha,numero,aux.getNombre(),2));
 	    		   }
 	    	   }
 	 		}
 	        mmsCur.close();
        }
        
        Cursor mailCur = DatabaseHelper.getInstance(context).getAllEmailsOfContactoByDBId(aux);
        while (mailCur.moveToNext()) 
	    {
        	String id = mailCur.getString(mailCur.getColumnIndex(DatabaseHelper.emailsID));
	    	String numero = mailCur.getString(mailCur.getColumnIndex(DatabaseHelper.direction));
	    	Date fecha = new Date(mailCur.getLong(mailCur.getColumnIndex(DatabaseHelper.fechaHora)));
 	        
 	        adapter.addItemInfo(new ItemEmail(Integer.parseInt(id),idContacto,2,fecha,numero,aux.getNombre()));
 		}
        mailCur.close();
        
        Cursor bobCur = DatabaseHelper.getInstance(context).getAllMensajesBobOfContactoByDBId(aux,true,true);
        while (bobCur.moveToNext()) 
	    {
        	int id = bobCur.getInt(bobCur.getColumnIndex(DatabaseHelper.mensajeID));
        	int tipo = bobCur.getInt(bobCur.getColumnIndex(DatabaseHelper.mensajeType));
	    	Date fecha = new Date(bobCur.getLong(bobCur.getColumnIndex(DatabaseHelper.mensajeFecha)));
    		String usuario = DatabaseHelper.getInstance(context).getContactByDBId(new Contacto(idContacto)).getUsuario();
 	        
    		MensajeBob item = new MensajeBob(id,tipo,fecha,"",usuario);
 	        item.setIdContacto(idContacto);
 	        adapter.addItemInfo(item);
 		}
        bobCur.close();
        
        adapter.ordenarHistorial(ItemHistorial.comparadorFechaDesc);
        return aux;
	}
	
	private String parse(ContentResolver cr, String numero)
	{
		if(numero.startsWith("+"))
		{
			numero=numero.substring(4);
		}
		
		return numero;
	}
}